// 导入数据持久化cookie模块
import { getToken, setToken, removeToken, setTimeStamp } from '@/utils/auth'
// 引入api的user登录方法
import { getUserInfo, login, getUserDetailById } from '@/api/user'
// 引入清空重置路由的方法
import { resetRouter } from '@/router'
// 剥离出来  避免下面export default拥挤
const state = {
  // 定义设置一个token
  // 一开始就从getToken中获取token
  token: getToken(), // 设置token初始状态   token持久化 => 放到缓存中

  // 定义一个保存用户资料的空对象  不能是null 因为null.里面的参数会报错
  userInfo: {}
}
const mutations = {
  // 定义一个修改state里面token的方法
  setToken (state, token) {
    state.token = token // 修改了state里面token
    // vuex中token变化后缓存数据
    setToken(token)
  },
  // 定义一个删除token的方法
  removeToken (state) {
    state.token = null // 清除vuex里面的token
    removeToken() // 清除缓存里面的token
  },

  // 定义一个修改用户资料的mutation的方法
  setUserInfo (state, result) {
    // 这里是响应式 因为给userInfo这个对象重新赋值
    state.userInfo = result
    // 这个也是响应式  相当于浅拷贝  也可以使用
    // state.userInfo = { ...result }
    // 这个不是响应式  因为是往原对象里面追加
    // state.userInfo['userName'] = result
  },

  // 定义一个清除用户信息资料的方法   场景:退出登录需要清除用户信息资料
  removeUserInfo (state) {
    state.userInfo = {} // 直接设置为空对象不能设置为null   因为  比如 null.name会报错  空对象.name则不会
  }
}
const actions = {
  // 设置action登录请求的异步方法
  async login (context, data) {
    // 经过响应拦截器的处理之后 这里的result实际上就是 token
    const result = await login(data) // 实际上就是一个promise  result就是执行的结果
    // 实际上就是一个promise  result就是执行的结果
    // axios默认给数据加了一层data
    // 表示登录接口调用成功 也就是意味着你的用户名和密码是正确的
    // 现在有用户token
    // actions 修改state 必须通过mutations
    context.commit('setToken', result)
    // 存入登录获取token时间戳
    setTimeStamp()
  },

  // 设置action登出请求的方法
  logout (context) {
    // 登出需要清除token  调用removeToken方法
    context.commit('removeToken')
    // 调用removeUserInfo  需要清除用户信息资料
    context.commit('removeUserInfo')
    // 清空重置路由  方法在router.index里面
    resetRouter()
    // 还要清空vuex里面permission里面的路由信息
    // 子模块调用permission子模块的方法  setRoutes将routes设置为空   子模块调用子模块方法需要第三个参数{ root: true }
    context.commit('permission/setRoutes', [], { root: true })
    // 重置多页签
    context.dispatch('tagsView/delAllViews', null, { root: true })
  },

  // 设置一个调用用户资料接口的action方法
  async getUserInfo (context) {
    // 调用获取用户资料接口   不需要传参
    const result = await getUserInfo()
    // 这里已经获取到了用户的基本资料 可以调用获取用户详情资料里面有头像
    const baseInfo = await getUserDetailById(result.userId)
    // 将两个对象合并
    const baseResult = { ...result, ...baseInfo }
    // 使用mutation里的setUserInfo方法修改state里面userInfo的数据
    // 将获取到的个人用户信息放到userInfo里面
    context.commit('setUserInfo', baseResult)
    return baseResult // 这里为什么要返回 为后面设置访问权限埋下伏笔
  }
}

export default {
  namespaced: true,
  state,
  mutations,
  actions
}
